package jrain.fw.script.expression;

import java.util.Map;

import jrain.fw.script.resolver.VariableResolver;
import jrain.fw.script.tools.ELException;
import jrain.fw.script.tools.Logger;

 
public class ExpressionString {
	// -------------------------------------
	// Properties
	// -------------------------------------
	// property elements

	Object[] mElements;

	public Object[] getElements() {
		return mElements;
	}

	public void setElements(Object[] pElements) {
		mElements = pElements;
	}

	// -------------------------------------

	/**
	 * Constructor
	 */
	public ExpressionString(Object[] pElements) {
		mElements = pElements;
	}

	// -------------------------------------

	/**
	 * Evaluates the expression string by evaluating each element, converting it to a String (using toString, or "" for null values) and concatenating the
	 * results into a single String.
	 */
	public String evaluate(Object pContext, VariableResolver pResolver, Map<Object, Object> functions, String defaultPrefix, Logger pLogger)
			throws ELException {
		StringBuffer buf = new StringBuffer();
		for (int i = 0; i < mElements.length; i++) {
			Object elem = mElements[i];
			if (elem instanceof String) {
				buf.append((String) elem);
			} else if (elem instanceof Expression) {
				Object val = ((Expression) elem).evaluate(pContext, pResolver, functions, defaultPrefix, pLogger);
				if (val != null) {
					buf.append(val.toString());
				}
			}
		}
		return buf.toString();
	}

	// -------------------------------------

	/**
	 * Returns the expression in the expression language syntax
	 */
	public String getExpressionString() {
		StringBuffer buf = new StringBuffer();
		for (int i = 0; i < mElements.length; i++) {
			Object elem = mElements[i];
			if (elem instanceof String) {
				buf.append((String) elem);
			} else if (elem instanceof Expression) {
				buf.append("${");
				buf.append(((Expression) elem).getExpressionString());
				buf.append("}");
			}
		}
		return buf.toString();
	}

	// -------------------------------------
}
